package com.chris.libs.example.pages.ext.smartrefresh;

import android.os.Handler;
import android.view.View;

import androidx.recyclerview.widget.LinearLayoutManager;

import com.chris.libs.base.x.mvpp.callbacks.BaseRecyclerView;
import com.chris.libs.base.x.mvpp.mvpp.AbsStandardActivityViewProxy;
import com.chris.libs.base.x.mvpp.recycler.DefaultRvAdapter;
import com.chris.libs.example.model.DataItem;
import com.scwang.smartrefresh.header.MaterialHeader;
import com.scwang.smartrefresh.layout.constant.SpinnerStyle;
import com.scwang.smartrefresh.layout.footer.BallPulseFooter;

import javax.inject.Inject;

/**
 * @author Chris Chan
 * Create on 2025-09-12 15:25
 * Use for:
 * Explain:
 * 1. 继承定义好的抽象类AbsStandardActivityViewProxy，节省代码量
 * 2. 实现契约定义好的View接口，以保持和Presenter的交互
 */
public class SmartRefreshViewProxy extends AbsStandardActivityViewProxy
        implements SmartRefreshContract.UIView {
    // 数据中心
    private SmartRefreshViewModel viewModel;
    // 界面元素持有者
    @Inject
    SmartRefreshViewHolders.MainViewHolder vh;
    // 业务逻辑处理中心
    @Inject
    SmartRefreshPresenter presenter;

    private DefaultRvAdapter<DataItem, SmartRefreshViewHolders.ItemDataRvViewHolder> itemDataAdapter;

    // Dagger2注入构造器
    @Inject
    public SmartRefreshViewProxy() {
    }

    /**
     * 初始化代码，在对象实例创建后执行
     */
    @Override
    protected void init() {
        // 获取数据中心实例
        this.viewModel = getViewModel(SmartRefreshViewModel.class);
        // 为界面元素持有者绑定根布局，注入式构造器没有传参数，需要手动传入
        this.vh.bind(this.contentView);
        // 为业务逻辑处理器绑定View代理，注入式构造器没有传参数，需要手动传入
        this.presenter.bind(this);
        // 为业务逻辑处理器传递数据中心，使View和Presenter共同联系在一个数据中心上
        this.presenter.setViewModel(this.viewModel);
    }

    /**
     * 初始化控件，界面元素如果有其他逻辑上的修改，可以在此处处理
     */
    @Override
    protected void initView() {
        this.itemDataAdapter = SmartRefreshAdapterManager.createItemDataAdapter(this.context, null, new BaseRecyclerView.OnItemClickListener<DataItem>() {
            @Override
            public void onItemClick(String tag, View itemView, int position, DataItem item, View childView, Object childDataValue) {
                showMessage(item.getTitle());
            }
        });
        this.vh.rvSmart.setLayoutManager(new LinearLayoutManager(this.context));
        this.vh.rvSmart.setAdapter(this.itemDataAdapter);
        this.vh.srlRefresh.setRefreshHeader(new MaterialHeader(this.context));
        this.vh.srlRefresh.setRefreshFooter(new BallPulseFooter(this.activity).setSpinnerStyle(SpinnerStyle.Scale));
    }

    /**
     * 事件设置
     */
    @Override
    protected void setupEvent() {
        // 给LiveData配置订阅事件
        update(this.viewModel.getDataList(), this.itemDataAdapter::updateData);
        update(this.viewModel.getMoreDataList(), this.itemDataAdapter::loadMore);

        // 下拉刷新
        this.vh.srlRefresh.setOnRefreshListener(refreshLayout -> {
            refreshLayout.autoRefresh();

            new Handler().postDelayed(() -> {
                // 重新获取数据
                presenter.refreshData();
                refreshLayout.finishRefresh();
            }, 2000);
        });

        // 上拉加载更多
        this.vh.srlRefresh.setOnLoadMoreListener(refreshLayout -> {
            refreshLayout.autoLoadMore();
            // 获取更多数据
            presenter.loadMoreData(1, 10);

            new Handler().postDelayed(refreshLayout::finishLoadMore, 2000);
        });
    }

    /**
     * 一切准备就绪后，可以开始执行第一个逻辑
     */
    @Override
    protected void onReady() {
        // 调用Presenter定义的方法
        this.presenter.refreshData();
    }

}
